/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package pushy.server;


/**
 *
 * @author pkoch1
 */
public class Level {
    private Objekt[][][] level;
    
    private String green;
    private String yellow;
    
    private Pushy greenPushy;
    private Pushy yellowPushy;
    
    public Level(String green, String yellow) {
        level = new Objekt[20][12][2];
        this.green = green;
        this.yellow = yellow;
    }
    
    public Level(String green, String yellow, String fromText) {
        this.green = green;
        this.yellow = yellow;
        setObjekte(Level.fromString(fromText).getObjekte());
    }

    public Objekt[][][] getObjekte() {
        return level;
    }
    
    public void setObjekte(Objekt[][][] objekte) {
        level = objekte;
    }
    
    public String getGreen() {
        return green;
    }

    public String getYellow() {
        return yellow;
    }

    public void setYellow(String yellow) {
        this.yellow = yellow;
    }

    public void setGreenPushy(Pushy greenPushy) {
        this.greenPushy = greenPushy;
    }

    public void setGreen(String green) {
        this.green = green;
    }

    public void setYellowPushy(Pushy yellowPushy) {
        this.yellowPushy = yellowPushy;
    }
    
    /**
     * Prüft, ob das Ziel von beiden Pushys betreten wurde
     * @return 
     */
    public boolean zielBetreten() {
        if(getObjekt(getPushy(green).x(), getPushy(green).y())[0].getFullName().equals("ziel-grün")) { 
            //System.out.println("Grün hat sein Ziel betreten");
            if(getObjekt(getPushy(yellow).x(), getPushy(yellow).y())[0].getFullName().equals("ziel-gelb")) {
                //System.out.println("Gelb hat sein Ziel betreten");
                return true;
            }
        }
        return false;
    }
    
    public void setObjekt(int x, int y, int z, Objekt obj) {
        level[x][y][z] = obj;
    }
    
    public Objekt getObjekt(int x, int y, int z) {
        return level[x][y][z];
    }
    
    public Objekt[] getObjekt(int x, int y) {
        if(level.length > x && level[0].length > y) {
            return level[x][y];
        }
        return null;
    }
    
    public Objekt[][][] getLevel() {
        return level;
    }
    
    public int getX() {
        return level.length;
    }
    
    public int getY() {
        return level[0].length;
    }
    
    /**
     * Das oberste Objekt wird an der Stelle x y zurückgegeben, wenn dies nicht existiert wird das untere zurückgegeben
     * @param x
     * @param y
     * @return 
     */
    public Objekt getWichtigesObjekt(int x, int y) {
        if(getObjekt(x, y, 1) != null) {
            return getObjekt(x, y, 1);
        }
        return getObjekt(x, y, 0);
    }
    
    /**
     * Erstellt aus einem String in Form von Obj:Obj|Obj:Obj ein 10x10 Level
     * @param s
     * @return Das Level
     */
    public static Level fromString(String s) {
        Level l = new Level("", "");
        String[] split = s.split("\\|");
        int c = 0;
        for(int x = 0; x < l.getX(); x++) {
            for(int y = 0; y < l.getY(); y++) {
                if(split[x].contains(":")) {
                    String[] split2 = split[c].split(":");
                    l.setObjekt(x, y, 0, Objekt.fromString(split2[0], new int[]{x, y}, l));
                    l.setObjekt(x, y, 1, Objekt.fromString(split2[1], new int[]{x, y}, l));
                    if(split2[1].contains("pushy")) System.out.println(x + " " + y);
                }else {
                    l.setObjekt(x, y, 0, Objekt.fromString("0", new int[]{x, y}, l));
                    l.setObjekt(x, y, 1, Objekt.fromString("0", new int[]{x, y}, l));
                }
                c++;
            }
        }
        System.out.println("LEVEL AUS STRING AUSGELESEN!");
        return l;
    }
    
    /**
     * Beispiellevel wird in Textform zurückgegeben
     * @return 
     */
    public static Level getDefaultLevel() {
        String level = 
                  "boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|wand:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:0|boden:pushy-grün|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|ziel-grün:0|boden:wand|boden:wand|ziel-gelb:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:0|boden:wand|boden:0|boden:0|boden:0|boden:pushy-gelb|boden:0|boden:0|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand|boden:wand";
        return fromString(level);
    }
    
    /**
     * Level wird in String konvertiert, Format siehe Wiki
     * @return 
     */
    @Override
    public String toString() {//ToDo
        String str = "";
        for(int x = 0; x < getX(); x++) {
            for(int y = 0; y < getY(); y++) {
                if(getObjekt(x, y, 0) != null) {
                    str = str + getObjekt(x, y, 0).getFullName();
                }else {
                    str = str + "0";
                }
                str = str + ":";
                if(getObjekt(x, y, 1) != null) {
                    str = str + getObjekt(x, y, 1).getFullName();
                }else {
                    str = str + "0";
                }
                str = str + "|";
            }
        }
        return str.substring(0, str.length()-1);
    }
    
    /**
     * Findet die Farbe des jeweiligen Nutzers
     * @param user
     * @return 
     */
    public String getUserColor(String user) {
        if(green.equals(user)) {
            return "grün";
        }
        return "gelb";
    }
    
    /**
     * Das Pushy-Objekt wird für den Nutzer user zurückgegeben
     * @param user
     * @return 
     */
    public Pushy getPushy(String user) {
        String color = getUserColor(user);
        if(color.equals("grün") && greenPushy != null) return greenPushy;
        if(color.equals("gelb") && yellowPushy != null) return yellowPushy;
        for(int x = 0; x < getX(); x++) {
            for(int y = 0; y < getY(); y++) {
                for(int z = 0; z < 2; z++) {
                    Objekt o = getObjekt(x, y, z);
                    if(o instanceof Pushy) {
                        if(o.getFarbe().equals(color)) {
                            if(color.equals("grün")) greenPushy = (Pushy) o;
                            if(color.equals("gelb")) yellowPushy = (Pushy) o;
                            return (Pushy) o;
                        }
                    }
                }
            }
        }
        
        return null;
    }
    
    public void updateFromString(String str) {
        setObjekte(Level.fromString(str).getObjekte());
    }
}
